avreal synchronisation lost
але боялися спитати.
Судячи з логів сайту, доволі часто шукають фразу «synchronisation lost», але чомусь досі ніхто не задав запитання про неї у коментарях до сторінки avreal.
Повідомлення «synchronisation lost» означає порушення обміну інформацією з програмованим мікроконтроллером. Обмін по SPI між адаптером програмування та вбудованою в мікроконтроллер апаратурою програмування відбувається так само, як і між двома мікроконтроллерами.
Байти, які посилаються програматором (MASTER), потрапляють в регістр зсуву апаратури програмування (SLAVE) та, якщо не будуть замінені на інформацію від неї, знову будуть передані назад в програматор.
При виконанні команд запису у відповідь на перший байт приходить останній байт попередньої команди, а перші три байти чотирибайтової команди повторюються на виході MISO з затримкою на один байт. При виконанні команд зчитування перші два байти повертаються в другому та третьому байті відповіді, а в четвертому байті відповіді третій байт команди заміщується на прочитаний з мікроконтроллера.
Наприклад, при виконанні команди Read Fuse High bits
потік даних виглядає наступним чином
Direction | Byte 1 | Byte 2 | Byte 3 | Byte 4 |
---|---|---|---|---|
programmer → controller | 0x58 | 0x08 | 0x00 | 0x00 |
controller → programmer | last byte of previous command |
0x58 | 0x08 | fuse value |
Подивитися деякі команди та відповіді на них в процесі роботи avreal можна за допомогою ключа -%.
Adapter enabled % Reset % PgmOn reply FF FE 53 00 % Synchronised after 1 try % GetID reply 00 30 00 1E % GetID reply 00 30 00 94 % GetID reply 00 30 00 06 % Read ID: 0x1E9406 Device connected, mega168|mega168A detected % Read Lock command 58 00 00 00, reply 00 58 00 FF Chip not locked % Read Osccal command 38 00 00 00, reply 00 38 00 B0 % Read Fuses command 50 00 00 00, reply 00 50 00 C2 % Read Fuses command 58 00 00 00, reply 00 58 00 FF % Read Fuses command 58 08 00 00, reply 00 58 08 DD % Read Fuses command 50 08 00 00, reply 00 50 08 F9
Отже, при синхронній роботі програматора та програмованого мікроконтроллера байти 2 та 3 відповіді співпадатимуть з байтами 1 та 2 команди.
Неспівпадіння під час передачі команд свідчить про те, що мікроконтроллер вийшов з режиму програмування і перестав відповідати на команди або про те, що в петлі обміну було спотворено команду або відповідь на неї. В будь-якому разі не варто продовжувати роботу з мікроконтроллером, бо неправильно сприйняті команди можуть зробити неприємні зміни в мікроконтроллері, наприклад, поставити небажане значення fuses. Тому при неспівпадінні avreal виходить з режиму програмування і закінчує роботу зі вказаним повідомленням.
Схожим чином відбувається вхід в режим програмування. Різниця в тому, що перший байт команди не передається назад в програматор, бо на цей момент мікроконтроллер ще не ввійшов в режим програмування. В кінці прийому другого байту послідовності 0xAC 0x53 0x00 0x00 мікроконтроллер входить в режим програмування і в третьому байті передає назад значення 0x53. Якщо відповідь інша, проводиться процедура пересинхронізації, наприклад, така
3. The Serial Programming instructions will not work if the communication is out of synchronization. When in sync. the second byte (0x53), will echo back when issuing the third byte of the Programming Enable instruction. Whether the echo is correct or not, all four bytes of the instruction must be transmitted. If the 0x53 did not echo back, give RESET a positive pulse and issue a new Programming Enable command.
Якщо ж через певну кількість спроб не вдається отримати правильну відповідь, avreal закінчує роботу з повідомленням Can’t resync (друге місце після synchronisation lost по кількості тих, хто боїться спитати).
Найімовірніші причини порушення синхронізації це «брудні» сигнали на лініях програмування, пов’язані зі «дзвоном» в лініях передачі та частота SCK на межі того, що може сприйняти мікроконтроллер. В першому випадку необхідно звернути увагу на якість виготовлення адаптера та з’єднувальних кабелів, в другому — знизити частоту тактування SPI ключем -o (-os).